13章 特殊なデータ型
13.3 qst_exe.icon
13.1 構造体
(これだけに気になった)
ユーザー定義の構造化データ(クラスにおいて、メンバデータだけで構成されて、ルーチンが存在しないもの)
構造体が必要な状況がよく分からなかった
よく分かった(クラスだと色々できてしまうと困る)
/icons/hr.icon
13.3 グローバルデータ
グローバル変数自体がエラーの原因になるわけではないが、グローバル変数を使うのがベストなことはほぼない。
それはそう
13.3.1 グローバル変数の一般的な問題
不用意に変更される場合がある
グローバル変数のエイリアス問題
グローバル変数と再入問題
マルチスレッドで動く場合にもグローバル変数の意味を保つ必要がある
コードの再利用がしにくい
初期化の手順が一定でない
グローバル変数を使用するとモジュール性が損なわれ、頭で整理しにくくなる
13.3.2 グローバルデータを使用する理由
グローバルなデータの保存
対話モードかコマンドラインモードか
データテーブル
Vuexのstoreもグローバルデータだよね…
名前付き定数のエミュレーション
PythonやPerl、awkなどは名前付き定数に対応していない
列挙型のエミュレーション
頻繁に利用するデータの合理化
ある変数がすべてのルーチンの引数に使われている場合
トランプデータの削除
別のクラスやルーチンで使うためだけに渡すデータをなくす
なるほどだけど本当にそうなのか
13.3.3 グローバルデータはあくまでも最後の手段として
最初は全ての変数をローカルで宣言し、必要に応じてグローバル化する
private → protected → public
グローバル変数とクラス変数を区別する
アクセスルーチンを使用する
13.3.4 アクセスルーチンの使用
アクセスルーチンを使って、情報隠蔽とデータの一元管理をする
アクセスルーチンの利点
データを一元管理できる
変数への全ての参照がバリケードで囲まれる
情報隠蔽の一般的な利点が自動的に得られる
アクセスルーチンは抽象データ型に変換しやすい
ついこの間JSで似たような問題に遭遇
アクセスルーチンの使用法
グローバル変数が必要なすべてのコードでアクセスルーチンを使用する
すべてのグローバル変数を同じ樽に放り込まない
ロックを使ってグローバル変数へのアクセスを制御する
アクセスルーチンに抽象性を組み込む
データへのすべてのアクセスを同じ抽象化レベルで行う
13.3.5 グローバルデータの使用に伴うリスクを減らすには
グローバル変数であることがひとめでわかるような命名規則を作成する
すべてのグローバル変数を詳しく説明するリストを作成する
これはメンテナンスされるのか…?
グローバル変数で中間結果を保持しない
全てのデータを1つの巨大なクラスに詰め込んでグローバルを使っていない風なことはしない
13.5 まとめ
構造体は、プログラムの複雑さを和らげ、プログラムを理解しやすく保守しやすいものにする。
構造体を使用するかどうかについて検討する場合は、それによってクラスの動作が良くなるかどうかを考える。
ポインタはエラーの原因になりやすい。アクセスルーチンやクラス、防御的プログラミングを使って自衛する。
グローバル変数を使用しない。単にリスクがあるからという理由だけでなく、他にもっと良い方法があるからだ。
グローバル変数を使用せざるを得ない場合は、アクセスルーチンを使って操作する。アクセスルーチンを使用すれば、グローバル変数のすべての利点以上のものが得られる。